home *** CD-ROM | disk | FTP | other *** search
Modula Implementation | 1997-10-26 | 12.9 KB | 447 lines |
- (*----------------------------------------------------------------------*
- * *
- * MAGIC Modula's All purpose GEM Interface Cadre *
- * ÿ ÿ ÿ ÿ ÿ *
- *----------------------------------------------------------------------*
- * Version 3.30 02.02.1992 (C)90/91/92 by Peter Hellinger Software *
- *----------------------------------------------------------------------*
- * Dieses Modul ist urheberrechtlich geschtzt. *
- * *
- * Die Verffentlichung des Quelltextes oder Teilen daraus in schrift- *
- * licher Form, insbesondere in Zeitschriften, sowie die Verbreitung *
- * ber Public-Domain-Hndler bedarf der ausdrcklichen schriftlichen *
- * Genehmigung des Autors! *
- * *
- * Der Autor gibt hiermit die ausdrckliche Erlaubnis, das Modul jeder- *
- * zeit auch im Quelltext weiterzugegeben, sofern dessen Text und ins- *
- * besondere dieser Urheberrechts-Vermerk nicht verndert wird, und *
- * durch die Weitergabe kein finanzieller Nutzen entsteht. Der Autor *
- * behlt sich das Recht vor, diese Erlaubnis jederzeit u. ohne Angaben *
- * von Grnden zu widerrufen. *
- *----------------------------------------------------------------------*)
-
- IMPLEMENTATION MODULE MagicFSM;
-
- (*----------------------------------------------------------------------*
- * Int. Vers | Datum | Name | nderung *
- *-----------+----------+------+----------------------------------------*
- * 1.00 | 02.02.92 | Hp | *
- *-----------+----------+------+----------------------------------------*)
-
-
-
- (* IMPLEMENTATION FR >>> Megamax-Modula-2 <<< *)
- (* *)
- (*$R- Range-Checks *)
- (*$S- Stack-Check *)
- (* *)
- (*----------------------------------------------*)
-
-
-
-
-
-
- FROM MagicSys IMPORT Nil, Null, Bit0, Bit1, Bit2, Bit3, Bit4, Bit5, Bit6,
- Bit7, Bit8, Bit9, Bit10, Bit11, Bit12, Bit13, Bit14,
- Bit15, LOC, Byte, ByteSet, sWORD, sINTEGER, sCARDINAL,
- sBITSET, lINTEGER, lCARDINAL, lWORD, lBITSET,
- CastToChar, CastToByte, CastToByteset, CastToInt,
- CastToCard, CastToBitset, CastToWord, CastToLInt,
- CastToLCard, CastToLBitset, CastToLWord, CastToAddr,
- TosVersion, Accessory, Basepage, SysHeader, TosDate;
-
-
-
-
-
-
- IMPORT SYSTEM, MagicSys;
- FROM MagicVDI IMPORT VDIIntIn, VDIIntOut, VDIPtsIn, VDIPtsOut,
- VDIControl, VDICall, VDIPB;
-
-
- VAR array: POINTER TO ARRAY [0..255] OF sINTEGER;
-
-
- PROCEDURE InqFacename (handle, element: sINTEGER;
- VAR name: ARRAY OF CHAR; VAR fsm: BOOLEAN): sINTEGER;
- VAR i: sINTEGER;
- BEGIN
- VDIIntIn[0]:= element;
- VDIIntOut[33] := 0;
- VDICall (130, 0, 1, 0, handle);
- FOR i:= 1 TO 32 DO name[i-1]:= CHR(VDIIntOut[i]) END;
- IF HIGH (name) >= 32 THEN name[32] := 0C; END;
- fsm:= (VDIControl[4] >= 34) & (VDIIntOut[33] = 1);
- RETURN VDIIntOut[0];
- END InqFacename;
-
- PROCEDURE fillIntin (REF string: ARRAY OF CHAR; VAR adr: SYSTEM.ADDRESS; VAR len: sCARDINAL);
- (* Fllt das IntIn-Array, alloziert ggf. einen neuen Speicherblock
- * dafr und gibt die Adresse zurck
- *)
- VAR h : sCARDINAL;
- c : sCARDINAL;
- a : SYSTEM.ADDRESS;
- BEGIN
- h:= HIGH(string);
- SYSTEM.ASSEMBLER
- MOVEQ #0,D0
- MOVE.W h(A6),D1
- MOVEQ #0,D2
- MOVE.L string(A6),A0
- LEA VDIIntIn,A1
- MOVE.L A1,a(A6)
- loop:
- MOVE.B (A0)+,D2
- MOVE.W D2,(A1)+
- BEQ.S exit
- ADDQ.W #1,D0
- CMPI.W #512,D0 (* VDIIntIn voll? *)
- BEQ.S mist
- SUBQ.W #1,D1
- BNE.S loop
- exit:
- BRA.S end
- mist:
- ; Jetzt erstmal die Lnge feststellen
- MOVE.L A0,A2
- MOVE.W D0,D2
- lm:
- ADDQ.W #1,D2
- TST.B (A2)+
- BNE.S lm
- lmend:
- ; Lnge steht nun in D2
- ; Speicher fr neues VDIIntIn beim GEMDOS anfordern
- MOVEM.L D0-D1/A0-A1/A3-A6,-(SP)
- LSL.W #1,D2 ; * 2 fr Integer
- MOVE.L D2,-(SP)
- MOVE.W #72, -(SP)
- TRAP #1
- ADDQ.L #6, SP
- MOVE.L D0,A2
- BEQ.S fail ; kein Speicher mehr frei! Wir machen ganu normal weiter
- MOVE.L D0,a(A6)
- MOVEM.L (SP)+,D0-D1/A0-A1/A3-A6
- ; Jetzt VDIIntIn nochmal kopieren
- LEA VDIIntIn,A1
- MOVE.W D0,D2
- SUBQ.W #1,D2
- lm2:
- MOVE.W (A1)+,(A2)+
- DBRA D2, lm2
- ; So, jetzt ist das Array kopiert.
- ; Jetzt mssen wir noch ein paar Register wiederherstellen und knnen dann in Loop
- ; weitermachen
- MOVE.L A2,A1
- fail:
- MOVEQ #0,D2
- SUBQ.W #1,D1
- BNE.S loop
- end:
- MOVE.W D0,c(A6)
- END;
- adr := a;
- len := c;
- END fillIntin;
-
- PROCEDURE freeIntin (a: SYSTEM.ADDRESS);
- BEGIN
- SYSTEM.ASSEMBLER
- LEA VDIIntIn,A0
- MOVE.L a(A6),A1
- CMPA.L A0,A1
- BEQ.S exit
- ; Mfree fr a aufrufen
- MOVE.L A1, -(SP)
- MOVE.W #73, -(SP)
- TRAP #1
- ADDQ.L #6, SP
- exit:
- END;
- VDIPB.intin := SYSTEM.ADR(VDIIntIn);
- END freeIntin;
-
- PROCEDURE InqFExtent (handle: sINTEGER; REF string: ARRAY OF CHAR;
- VAR extent: ARRAY OF LOC);
- VAR c, h: CARDINAL;
- a: SYSTEM.ADDRESS;
- BEGIN
- (*
- c:= 0; h:= HIGH(string);
- SYSTEM.ASSEMBLER
- MOVEQ #0,D0
- MOVE.W h(A6),D1
- MOVEQ #0,D2
- MOVE.L string(A6),A0
- LEA VDIIntIn,A1
- loop:
- MOVE.B (A0)+,D2
- MOVE.W D2,(A1)+
- BEQ.S exit
- ADDQ.W #1,D0
- SUBQ.W #1,D1
- BNE.S loop
- exit:
- MOVE.W D0,c(A6)
- END;
- (*
- WHILE (c <= h) AND (string[c] # 0C) DO
- VDIIntIn[c]:= ORD(string[c]); INC(c);
- END;
- *)
- *)
- fillIntin (string, a, c);
- VDIPB.intin := a;
- VDICall (240, 0, c, 0, handle);
- array:= SYSTEM.ADR(extent);
- FOR c:= 0 TO 7 DO array^[c]:= VDIPtsOut[c]; END;
- freeIntin (a);
- END InqFExtent;
-
- PROCEDURE FSMText (handle, x, y: sINTEGER; REF string: ARRAY OF CHAR);
- VAR c, h: CARDINAL;
- a : SYSTEM.ADDRESS;
- BEGIN
- (*
- c:= 0; h:= HIGH(string);
- SYSTEM.ASSEMBLER
- MOVEQ #0,D0
- MOVE.W h(A6),D1
- MOVEQ #0,D2
- MOVE.L string(A6),A0
- LEA VDIIntIn,A1
- loop:
- MOVE.B (A0)+,D2
- MOVE.W D2,(A1)+
- BEQ.S exit
- ADDQ.W #1,D0
- SUBQ.W #1,D1
- BNE.S loop
- exit:
- MOVE.W D0,c(A6)
- END;
- (*
- WHILE (c <= h) AND (string[c] # 0C) DO
- VDIIntIn[c]:= ORD(string[c]); INC(c);
- END;
- *)
- *)
- fillIntin (string, a, c);
- VDIPB.intin := a;
- VDIPtsIn[0]:= x;
- VDIPtsIn[1]:= y;
- VDICall(241, 1, c, 0, handle);
- freeIntin (a);
- END FSMText;
-
- PROCEDURE KillOutline (handle: sINTEGER; VAR component: ARRAY OF LOC);
- VAR trick: POINTER TO SYSTEM.ADDRESS;
- BEGIN
- trick:= SYSTEM.ADR (VDIIntIn[0]);
- trick^:= SYSTEM.ADR (component);
- VDICall(242, 0, 2, 0, handle);
- END KillOutline;
-
- PROCEDURE GetOutline (handle: sINTEGER; ch: CHAR; VAR component: ARRAY OF LOC);
- VAR trick: POINTER TO SYSTEM.ADDRESS;
- BEGIN
- VDIIntIn[0]:= ORD (ch);
- trick:= SYSTEM.ADR (VDIIntIn[1]);
- trick^:= SYSTEM.ADR (component);
- VDICall(243, 0, 3, 0, handle);
- END GetOutline;
-
- PROCEDURE SetScratch (handle, mode: sINTEGER);
- BEGIN
- VDIIntIn[0]:= mode;
- VDICall(244, 0, 1, 0, handle);
- END SetScratch;
-
- PROCEDURE SetErrormode (handle, mode: sINTEGER; VAR errorcode: sINTEGER);
- VAR trick: POINTER TO SYSTEM.ADDRESS;
- BEGIN
- VDIIntIn[0]:= mode;
- trick:= SYSTEM.ADR (VDIIntIn[1]);
- trick^:= SYSTEM.ADR (errorcode);
- VDICall(245, 0, 3, 0, handle);
- END SetErrormode;
-
- PROCEDURE SetArbpoints (handle, point: sINTEGER; VAR cw, ch, bw, bh: sINTEGER): sINTEGER;
- BEGIN
- VDIIntIn[0]:= point;
- VDICall(246, 0, 1, 0, handle);
- cw:= VDIPtsOut[0];
- ch:= VDIPtsOut[1];
- bw:= VDIPtsOut[2];
- bh:= VDIPtsOut[3];
- RETURN VDIIntOut[0];
- END SetArbpoints;
-
- PROCEDURE InqAdvance (handle: sINTEGER; ch: CHAR; VAR advx, advy, xr, yr: sINTEGER);
- BEGIN
- VDIIntIn[0]:= ORD (ch);
- VDICall(247, 0, 1, 0, handle);
- advx:= VDIPtsOut[0];
- advy:= VDIPtsOut[1];
- xr:= VDIPtsOut[2];
- yr:= VDIPtsOut[3];
- END InqAdvance;
-
- PROCEDURE InqDeviceinfo (handle, device: sINTEGER; VAR devstr: ARRAY OF CHAR): BOOLEAN;
- VAR l, i: sCARDINAL;
- b: BOOLEAN;
- BEGIN
- VDIIntIn[0]:= device;
- VDICall(248, 0, 1, 0, handle);
- l:= CastToCard (VDIControl[4]);
- IF VDIPtsOut[0] = 1 THEN
- i:= 0;
- LOOP
- IF i > HIGH (devstr) THEN EXIT; END;
- IF i > l THEN EXIT; END;
- devstr[i]:= CHR (VDIIntOut[i]); INC (i);
- END;
- IF i < HIGH (devstr) THEN devstr[i]:= 0C; END;
- RETURN TRUE;
- ELSE
- devstr[0]:= 0C;
- RETURN FALSE;
- END;
- END InqDeviceinfo;
-
- PROCEDURE SaveFSMCache (handle: sINTEGER; REF file: ARRAY OF CHAR): sINTEGER;
- VAR c, h: sINTEGER;
- BEGIN
- c:= 0; h:= HIGH(file);
- WHILE (c <= h) AND (file[c] # 0C) DO
- VDIIntIn[c]:= ORD(file[c]); INC(c);
- END;
- VDICall(249, 0, c, 0, handle);
- RETURN VDIIntOut[0];
- END SaveFSMCache;
-
- PROCEDURE LoadFSMCache (handle: sINTEGER; REF file: ARRAY OF CHAR; mode: sINTEGER): sINTEGER;
- VAR c, h: sINTEGER;
- BEGIN
- VDIIntIn[0]:= mode;
- c:= 0; h:= HIGH(file);
- WHILE (c <= h) AND (file[c] # 0C) DO
- VDIIntIn[c + 1]:= ORD(file[c]); INC(c);
- END;
- VDICall(250, 0, c + 1, 0, handle);
- RETURN VDIIntOut[0];
- END LoadFSMCache;
-
- PROCEDURE FlushFSMCache (handle: sINTEGER);
- BEGIN
- VDICall(251, 0, 0, 0, handle);
- END FlushFSMCache;
-
- PROCEDURE SetSize (handle, point: sINTEGER; VAR cw, ch, bw, bh: sINTEGER): sINTEGER;
- BEGIN
- VDIIntIn[0]:= point;
- VDICall(252, 0, 1, 0, handle);
- cw:= VDIPtsOut[0];
- ch:= VDIPtsOut[1];
- bw:= VDIPtsOut[2];
- bh:= VDIPtsOut[3];
- RETURN VDIIntOut[0];
- END SetSize;
-
- PROCEDURE SetSkew (handle, skew: sINTEGER): sINTEGER;
- BEGIN
- VDIIntIn[0]:= skew;
- VDICall(253, 0, 1, 0, handle);
- RETURN VDIIntOut[0];
- END SetSkew;
-
- PROCEDURE GetFSMAsciitable (handle: sINTEGER; VAR ascii, style: SYSTEM.ADDRESS);
- VAR p: POINTER TO SYSTEM.ADDRESS;
- BEGIN
- VDICall(254, 0, 0, 0, handle);
- p:= SYSTEM.ADR (VDIIntOut[0]); ascii:= p^;
- p:= SYSTEM.ADR (VDIIntOut[2]); style:= p^;
- END GetFSMAsciitable;
-
- PROCEDURE GetFSMCachesize (handle, cache: sINTEGER): lCARDINAL;
- VAR p: POINTER TO lCARDINAL;
- BEGIN
- VDIIntIn[0]:= cache;
- VDICall(255, 0, 1, 0, handle);
- p:= SYSTEM.ADR (VDIIntOut[0]);
- RETURN p^;
- END GetFSMCachesize;
-
- PROCEDURE GetBitmapinfo (handle, char: sINTEGER; VAR info: ARRAY OF LOC);
- VAR p: POINTER TO SYSTEM.ADDRESS;
- BEGIN
- VDIIntIn[0]:= char;
- p:= SYSTEM.ADR (VDIIntIn[1]); p^:= SYSTEM.ADR (info);
- VDICall(239, 0, 0, 3, handle);
- END GetBitmapinfo;
-
- PROCEDURE EnableBezier (handle: sINTEGER): sINTEGER;
- BEGIN
- VDICall(11, 1, 0, 13, handle);
- RETURN VDIIntOut[0];
- END EnableBezier;
-
- PROCEDURE DisableBezier (handle: sINTEGER);
- BEGIN
- VDICall(11, 0, 0, 13, handle);
- END DisableBezier;
-
- PROCEDURE BezierBuffer (handle: sINTEGER; buff: SYSTEM.ADDRESS; words: sINTEGER);
- VAR p: POINTER TO SYSTEM.ADDRESS;
- BEGIN
- p:= SYSTEM.ADR (VDIIntIn[0]);
- p^:= buff;
- VDIIntIn[2]:= words;
- VDICall(-1, 0, 0, 6, handle);
- END BezierBuffer;
-
- PROCEDURE Bezier (handle, count: sINTEGER;
- VAR xyarr, bezarr, extent: ARRAY OF LOC;
- VAR totpts, totmoves: sINTEGER);
- VAR oIntin, oPtsin, oIntout, oPtsout: SYSTEM.ADDRESS;
- BEGIN
- oIntin:= VDIPB.intin; VDIPB.intin:= SYSTEM.ADR (bezarr);
- oPtsin:= VDIPB.ptsin; VDIPB.ptsin:= SYSTEM.ADR (xyarr);
- oPtsout:= VDIPB.ptsout; VDIPB.ptsout:= SYSTEM.ADR (extent);
- VDICall(6, count, (count + 1) DIV 2, 13, handle);
- totpts:= VDIIntOut[0];
- totmoves:= VDIIntOut[1];
- VDIPB.intin:= oIntin;
- VDIPB.ptsin:= oPtsin;
- VDIPB.ptsout:= oPtsout;
- END Bezier;
-
- PROCEDURE FilledBezier (handle, count: sINTEGER;
- VAR xyarr, bezarr, extent: ARRAY OF LOC;
- VAR totpts, totmoves: sINTEGER);
- VAR oIntin, oPtsin, oIntout, oPtsout: SYSTEM.ADDRESS;
- BEGIN
- oIntin:= VDIPB.intin; VDIPB.intin:= SYSTEM.ADR (bezarr);
- oPtsin:= VDIPB.ptsin; VDIPB.ptsin:= SYSTEM.ADR (xyarr);
- oPtsout:= VDIPB.ptsout; VDIPB.ptsout:= SYSTEM.ADR (extent);
- VDICall(9, count, (count + 1) DIV 2, 13, handle);
- totpts:= VDIIntOut[0];
- totmoves:= VDIIntOut[1];
- VDIPB.intin:= oIntin;
- VDIPB.ptsin:= oPtsin;
- VDIPB.ptsout:= oPtsout;
- END FilledBezier;
-
- PROCEDURE BezierQuality (handle, percent: sINTEGER): sINTEGER;
- BEGIN
- VDIIntIn[0]:= 0; VDIIntIn[1]:= 0; VDIIntIn[2]:= percent;
- VDICall(5, 0, 3, 99, handle);
- RETURN VDIIntOut[0];
- END BezierQuality;
-
- END MagicFSM.
-
-